﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Xml.Linq;
using Vb = Microsoft.VisualBasic;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Autocentro.Entities;
using Microsoft.Practices.Unity;
using Autocentro.BussinesLogic;

namespace Autocentro.UI
{
    public partial class FrmMttCompra : Form
    {
        [Dependency]
        public IProveedorBL ProveedorBL { get; set; }

        [Dependency]
        public IProductoBL ProductoBL { get; set; }

        [Dependency]
        public ICompraBL CompraBL { get; set; }

        [Dependency]
        public IDetalleCompraBL DetalleCompraBL { get; set; }

        bool IsNew = true;
        
        public FrmMttCompra()
        {
            InitializeComponent();
            this.BuildUp();
        }

        private void FrmMttCompra_Load(object sender, EventArgs e)
        {
            CalcularTotal();
            lblNewProducto.Visible = false;
            lblAyuda.Visible = false;
            pRODUCTOBindingSource.DataSource = ProductoBL.GetAllFromSoloProductos("");
        }

        public void AddCompra()
        {
            cOMPRASBindingSource.AddNew();
        }
        
        public void CompraUpdate(int id)
        {
            IsNew = false;
            var compra = CompraBL.GetFromCompraById(id);
            compra.Proveedor = ProveedorBL.GetFromProveedorById(compra.IdProveedor);
            cOMPRASBindingSource.DataSource = compra;
            lblAyuda.Visible = false;
        }

        public void BuscarProducto()
        {
            List<PRODUCTO> existenProductos;

            var criterio = txtCriterio.Text == string.Empty ? null : txtCriterio.Text;

            existenProductos = ProductoBL.GetAllFromSoloProductos(criterio);
            pRODUCTOBindingSource.DataSource = ProductoBL.GetAllFromSoloProductos(criterio);

            if (existenProductos.Count <= 0)
            {
                lblNewProducto.Visible = true;
            }
            else
            {
                lblNewProducto.Visible = false;
                //pRODUCTOBindingSource.DataSource = existenProductos;
            }
            //if (txtCriterio.Text.Length > 0)
            //{
                //var criterio = txtCriterio.Text == string.Empty ? null : txtCriterio.Text;
                //pRODUCTOBindingSource.DataSource = ProductoBL.GetAllFromSoloProductos(criterio);
            //}
            //else Eelse MessageBox.Show("Es necesario ingresar almenos un caracter", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            BuscarProducto();
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProducto();
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            var addProducto = new FrmMttProducto();
            addProducto.AddProducto();
            addProducto.ShowDialog();
            lblNewProducto.Visible = false;
            BuscarProducto();
        }

        private void AgregarProducto()
        {
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var currentCompra = cOMPRASBindingSource.Current as COMPRAS;

            if (producto != null)
            {
                var detalle = new DETALLECOMPRA
                {
                    IdCompra = currentCompra.Id,
                    IdProducto = producto.Id,
                    Producto = producto,
                    Cantidad = 1,
                };

                var existe = currentCompra.DetalleCompra.Where(dc => dc.Producto.Id.Equals(producto.Id)).SingleOrDefault();

                if (existe == null)
                {
                    currentCompra.DetalleCompra.Add(detalle);

                    currentCompra.Total = currentCompra.DetalleCompra.Sum(dc => dc.Monto);
                }
                else
                {
                    var rpt = MessageBox.Show(this,string.Format("El producto: {0}," +
                        "ya se encuentra en le pedido desea agregra otro?", producto.Descripcion),
                    "Mensaje",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question);
                    if (rpt == DialogResult.Yes)
                    {
                        existe.Cantidad++;
                        currentCompra.Total = currentCompra.DetalleCompra.Sum(dc => dc.Monto);
                    }
                }
                
            }
            else
            {
                MessageBox.Show("Debe selecionar un producto");
            }
            cOMPRASBindingSource.ResetBindings(true);
            detalleCompraBindingSource1.ResetBindings(true);
        }
        
        private void btnQuitar_Click(object sender, EventArgs e)
        {
            QuitarProducto();
        }

        private void QuitarProducto()
        {
            var compra = cOMPRASBindingSource.Current as COMPRAS;
            var CurrentDetalle = detalleCompraBindingSource1.Current as DETALLECOMPRA;

            if (compra != null)
            {
                var rpt = MessageBox.Show(this,
                    string.Format("El Producto: {0}," +
                    "ya se encuentra en el pedido dese Quitar?",
                    CurrentDetalle.Producto.Descripcion),
                    "Quitar Producto",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question);
                if (rpt == DialogResult.Yes)
                {
                    if (CurrentDetalle.IdProducto>0)
                    {
                        DetalleCompraBL.DeleteDetalleCompra(CurrentDetalle.Item, compra.Id);
                    }
                    detalleCompraBindingSource1.RemoveCurrent();
                    CalcularTotal();
                }
                
            }
            else
            {
                MessageBox.Show("Debe selecionar un producto para poder Quitar");
            }
            cOMPRASBindingSource.ResetBindings(true);
            detalleCompraBindingSource1.ResetBindings(true);
        }

        private void CalcularTotal()
        {
            var compra = cOMPRASBindingSource.Current as COMPRAS;
            if (compra != null)
            {
                compra.Total =  compra.DetalleCompra.Sum(dc => dc.Monto);
                cOMPRASBindingSource.ResetBindings(true);
            }
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            VerificarProveedor();
        }

        private void VerificarProveedor()
        {
            var compra = cOMPRASBindingSource.Current as COMPRAS;

            if (rucTextBox.Text.Length == 0)
            {
                MessageBox.Show("Ingrese el número de RUC", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
                if (rucTextBox.Text.Length == 11)
                {
                    var proveedor = ProveedorBL.GetFromProveedorByRuc(rucTextBox.Text);
                    if (proveedor != null)
                    {
                        compra.Proveedor = proveedor;
                        compra.IdProveedor = proveedor.Id;
                        cOMPRASBindingSource.ResetBindings(true);
                    }
                    else
                    {
                        var rpt = MessageBox.Show(this, string.Format("Proveedor no Existe ¿Desea crearlo?"),
                            "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                        if (rpt == DialogResult.Yes)
                        {
                            var addProveedor = new FrmMttProveedor();
                            addProveedor.AddProveedorProforma(rucTextBox.Text);
                            addProveedor.ShowDialog();
                            VerificarProveedor();
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Longitud de RUC incorrecta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    compra.Proveedor = null ;
                    compra.IdProveedor = 0;
                    cOMPRASBindingSource.ResetBindings(true);
                }
        }

        private void rucTextBox_TextChanged(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void rucTextBox_Leave(object sender, EventArgs e)
        {
            lblAyuda.Visible = false;

            VerificarProveedor();
        }

        private void rucTextBox_Click(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void rucTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {
                FrmProveedor frm = new FrmProveedor();
                frm.Prove = true;
                frm.ShowDialog();
                if (frm.CurrentProveedor != null)
                {
                    var _compra = cOMPRASBindingSource.Current as COMPRAS;
                    _compra.Proveedor = frm.CurrentProveedor;
                    _compra.IdProveedor = frm.CurrentProveedor.Id;
                    cOMPRASBindingSource.ResetBindings(true);
                }
            }
            if (e.KeyCode == Keys.Enter)
            {
                VerificarProveedor();
            }
        }

        private void rucTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
            }
        }

        private void rucTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void pRODUCTODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.pRODUCTODataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
            {
                AgregarProducto();
            }
        }

        private void pRODUCTODataGridView_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            AgregarProducto();
        }

        private void detalleCompraDataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.detalleCompraDataGridView1.Columns[e.ColumnIndex].Name.Equals("Quitar"))
            {
                QuitarProducto();
            }
        }

        private void detalleCompraDataGridView1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsNumber(e.KeyChar) || e.KeyChar == (Char)Keys.Back)
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void detalleCompraDataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Asegurese de ingresar un valor correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void detalleCompraDataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 1 || e.ColumnIndex == 2)   //Columna 2
            {
                var producto = new PRODUCTO();
                var detalle = detalleCompraBindingSource1.Current as DETALLECOMPRA;

                if (detalle != null)
                {
                    producto = ProductoBL.GetFromProductoByID(detalle.Producto.Id);

                    if (detalle.Cantidad <= 0)
                    {
                        MessageBox.Show("La cantidad debe ser mayor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        detalle.Cantidad = 1;
                    }
                    CalcularTotal();
                }

                //CalcularTotal();
            }
        }

        private void detalleCompraDataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            QuitarProducto();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var compra = cOMPRASBindingSource.Current as COMPRAS;
            var msg = "ERROR";

            if (compra != null)
            {
                compra.NroGuia = txtNroGuia.Text.ToUpper();
                if (IsNew)
                {
                    try
                    {
                        CompraBL.AddCompra(compra);
                        IsNew = false;
                        MessageBox.Show("Registro Correcto", "Mensaje",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    try
                    {
                        CompraBL.UpdateCompra(compra);
                        CompraUpdate(compra.Id);
                        MessageBox.Show("Modificación Correcta", "Mensaje",
                        MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {

                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK,
                        MessageBoxIcon.Information);
                    }
                }
            }
        }

        private void btnBuscarDetalle_Click(object sender, EventArgs e)
        {
            BuscarProductoEnDetalle();
        }

        private void TxtProductoDesc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProductoEnDetalle();
            }
        }

        private void BuscarProductoEnDetalle()
        {

            List<DETALLECOMPRA> listatemp = new List<DETALLECOMPRA>();
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var _compra = cOMPRASBindingSource.Current as COMPRAS;

            if (_compra != null)
            {
                if (TxtProductoDesc.Text != null && TxtProductoDesc.Text != "" && TxtProductoDesc.Text != string.Empty)
                {
                    foreach (var item in _compra.DetalleCompra)
                    {
                        var descMayus = (TxtProductoDesc.Text).ToUpper();
                        var itemPRO = (item.Producto.Descripcion).ToUpper();
                        var a = itemPRO.Contains(descMayus);
                        if (a == true)
                        {
                            listatemp.Add(item);
                        }
                    }
                   detalleCompraBindingSource1.DataSource = listatemp;
                   detalleCompraBindingSource1.ResetBindings(true);
                }
                else
                {
                    detalleCompraBindingSource1.DataSource = _compra.DetalleCompra;
                    detalleCompraBindingSource1.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen productos en la Compra", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void detalleCompraDataGridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                QuitarProducto();
            }
        }

        private void txtCriterio_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/");
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void TxtProductoDesc_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/");
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

      


    }
}
